package com.gxatek.cockpit.dvr.service;



import android.graphics.Color;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.LimitLine;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;

public class LineChartUtil {
    private LineChart mLineChart;
    // 设置最多显示20个点
    int maxVisibleCount = 20;
    private float lastX = 0;
    public LineChartUtil(LineChart lineChart){
        mLineChart = lineChart;
    }
    /**
     * 初始化X轴
     */
    public void initXAxis() {
        XAxis xAxis = mLineChart.getXAxis();
        //  2.设置X轴的位置（默认在上方）：
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);//值：BOTTOM,BOTH_SIDED,BOTTOM_INSIDE,TOP,TOP_INSIDE
        //  3.设置X轴坐标之间的最小间隔（因为此图有缩放功能，X轴,Y轴可设置可缩放）
        xAxis.setGranularity(1f);
        //  4.设置X轴的刻度数量
        xAxis.setLabelCount(40, false);
        // 5.设置X轴的值（最小值、最大值、然后会根据设置的刻度数量自动分配刻度显示）
        xAxis.setAxisMinimum(0f);
        xAxis.setAxisMaximum(20f);
        // 6.设置当前图表中最多在x轴坐标线上显示刻度线的总量
        mLineChart.setVisibleXRangeMaximum(5);// 设置当前图表中最多在x轴坐标线上显示的刻度线总量为6
    }
    /**
     * 初始化折线图数据集合
     */
    public void initLineChartData() {
        // 创建一个空数据集合并将其设置到图表中
        LineDataSet dataSet = new LineDataSet(null, "动态折线图");
        dataSet.setLineWidth(2.0f);
        // 设置折线的颜色
        dataSet.setColor(Color.RED);
        // 设置曲线为圆滑曲线
        dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        // 设置折线图填充
        dataSet.setDrawFilled(true);
        // 设置每个点是否以圆圈来显示
        dataSet.setDrawCircles(true);
        // 是否显示每个点的y值
        dataSet.setDrawValues(true);
        // 创建LineData对象并设置其为图表的数据
        LineData data = new LineData(dataSet);
        mLineChart.setData(data);
    }
    /**
     * 初始化折线图
     */
    public void initLineChart() {
        // 折线图是否可以触摸
        mLineChart.setTouchEnabled(true);
        // 折线图是否可以拖动
        mLineChart.setDragEnabled(true);
        // 折线图是否可以放大
        mLineChart.setScaleEnabled(true);
        // 折线图是否显示网格
        mLineChart.setDrawGridBackground(true);
        // 如果设置为true, x和y轴可以用2个手指同时缩放，如果设置为false, x和y轴可以分别缩放。默认值:假
        mLineChart.setPinchZoom(true);
        // 返回图表的Description对象，该对象负责保存与显示在图表右下角的描述文本相关的所有信息(默认情况下)
        mLineChart.getDescription().setEnabled(false);
        mLineChart.animateX(1500);
        // 设置x轴的属性
        initXAxis();
        // 设置y轴的属性
        initYAxis();
        initLegend();
    }
    /**
     * 初始化折线图的图标
     */
    public void initLegend() {
        Legend legend = mLineChart.getLegend();
        // 设置图例位置为底部居中
        legend.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
        legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
        // 显示图例文本
        legend.setEnabled(true);

        // 设置图例文本颜色
        legend.setTextColor(Color.BLACK);

        // 设置图例样式为水平
        legend.setOrientation(Legend.LegendOrientation.HORIZONTAL);
        // 设置描述内容
        Description description = new Description();
        description.setText("时间/min");
        description.setTextColor(Color.RED);
        mLineChart.setDescription(description);
    }
    /**
     * 初始化折线图的y轴
     */
    public void initYAxis() {
        //  1.得到Y轴
        YAxis leftYAxis = mLineChart.getAxisLeft();
        YAxis rightYAxis = mLineChart.getAxisRight();
        // 2.设置某一个Y轴是否显示
        rightYAxis.setEnabled(false); //右侧Y轴不显示
        //3.限制线LimitLine(如上右图)
        LimitLine limitLine = new LimitLine(50,"警戒线"); //得到限制线
        limitLine.setLineWidth(2f); //宽度
        limitLine.setTextSize(10f);
        limitLine.setTextColor(Color.BLACK);  //颜色
        limitLine.setLineColor(Color.GREEN);
        leftYAxis.addLimitLine(limitLine); //Y轴添加限制线

        //4.X轴和Y轴类似，都具有相同的属性方法

        rightYAxis.setAxisMinimum(0f);
        rightYAxis.setAxisMaximum(100f);
        rightYAxis.setGranularity(1f);
//        rightYAxis.setLabelCount(11,false);
        rightYAxis.setTextColor(Color.BLUE); //文字颜色
        rightYAxis.setGridColor(Color.RED); //网格线颜色
        rightYAxis.setAxisLineColor(Color.GREEN); //Y轴颜色
    }

    public boolean addEntry() {
        LineData data = mLineChart.getData();
        if (data != null) {
            LineDataSet set = (LineDataSet) data.getDataSetByIndex(0);
            if (set == null) {
                set = createSet();
                data.addDataSet(set);
            }

            // 添加新点到数据集中
            data.addEntry(new Entry(lastX++, (float) (Math.random() * 80) + 10f), 0);

            // 更新数据
            data.notifyDataChanged();
            mLineChart.notifyDataSetChanged();

            // 平移x轴，确保新添加的点显示在最右侧

            float maxX = data.getXMax();
            if (maxX > maxVisibleCount) {
//                mLineChart.getXAxis().setAxisMinimum(data.getXMin() + 1);
//                mLineChart.getXAxis().setAxisMaximum(data.getXMax() + maxVisibleCount);
//                maxVisibleCount+=20;
                return false;
            }

            // 将图表滚动到最新的点处
            mLineChart.moveViewToX(data.getEntryCount()-4);
        }
        return true;
    }
    /**
     * 创建数据集
     */
    public LineDataSet createSet() {
        LineDataSet set = new LineDataSet(null, "动态折线图");
        set.setLineWidth(2.5f);
        set.setColor(Color.RED);
        set.setDrawCircles(false);
        set.setDrawValues(false);
        return set;
    }
}
